package com.niiwoo.civet.account.service;

import com.niiwoo.civet.account.dto.common.UserAccountInfoDTO;
import com.niiwoo.civet.account.dto.response.AccountBaseResponse;
import com.niiwoo.tripod.lanmao.enums.UserAuthorizationEnum;
import com.niiwoo.tripod.lanmao.enums.UserRoleEnum;
import com.niiwoo.tripod.lanmao.response.QueryUserInformationResponse;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

public interface AccountDubboService {

	/**
	 * =================================查询平台用户账户=====================================================
	 **/
	/**
	 * 查询平台用户账户信息：根据账户主键id + 账户角色 不存在则返回null
	 *
	 * @param userId
	 * @param role
	 * @return
	 */
	default AccountBaseResponse getNiiwooAccount(@NotNull String userId, @NotNull UserRoleEnum role) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取平台用户账户信息：根据用户id + 账户角色 不存在则抛出异常
	 *
	 * @param userId
	 * @param role
	 * @return
	 */
	default AccountBaseResponse loadNiiwooAccount(@NotNull String userId, @NotNull UserRoleEnum role) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取平台用户账户信息：根据用户id + 账户角色 不存在和未激活都抛出异常
	 *
	 * @param userId
	 * @param role
	 * @return
	 */
	default AccountBaseResponse loadActivedNiiwooAccount(@NotNull String userId, @NotNull UserRoleEnum role) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 查询平台用户账户信息列表：根据用户id
	 * 
	 * @param userId
	 * @return
	 */
	default List<AccountBaseResponse> listNiiwooAccountByUserId(@NotNull String userId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 查询平台用户账户信息列表：根据用户id
	 *
	 * @param userId
	 * @return
	 */
	default List<AccountBaseResponse> listNiiwooAccountByUserId(@NotNull String userId,@NotNull String orgId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 扁平化用户在平台的所有账号信息(余额和账号)
	 *
	 * @param userId
	 * @return
	 */
	default UserAccountInfoDTO queryNiiwooAccountFlat(String userId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * =================================查询机构用户账户=====================================================
	 **/
	/**
	 * 查询机构用户账户信息：根据用户id + 机构id 不存在则返回null
	 * 
	 * @param userId
	 * @param orgId
	 * @return
	 */
	default AccountBaseResponse getOrgAccount(@NotNull String userId, @NotNull String orgId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取机构用户账户信息：根据用户id + 机构id 不存在则抛出异常
	 * 
	 * @param userId
	 * @param orgId
	 * @return
	 */
	default AccountBaseResponse loadOrgAccount(@NotNull String userId, @NotNull String orgId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取机构用户账户信息：根据用户id + 机构id 不存在和未激活都抛出异常
	 * 
	 * @param userId
	 * @param orgId
	 * @return
	 */
	default AccountBaseResponse loadActivedOrgAccount(@NotNull String userId, @NotNull String orgId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * =================================公共=====================================================
	 **/
	/**
	 * 获取账户信息：根据账户主键id 不存在则抛出异常
	 * 
	 * @param accountId
	 * @return
	 */
	default AccountBaseResponse loadAccountById(@NotNull Long accountId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取账户信息：根据账户主键id（从主库查询）
	 * 
	 * @param accountId
	 * @return
	 */
	default AccountBaseResponse loadAccountByIdFromMaster(@NotNull Long accountId) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 获取账户信息：根据账户存管号 不存在则抛出异常
	 * 
	 * @param accountNo
	 * @return
	 */
	default AccountBaseResponse loadAccountByAccountNo(@NotNull String accountNo) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 检查存管账户权限
	 * 
	 * @param accountId
	 *            账户id
	 * @param authorizations
	 *            权限列表
	 */
	default void checkAccountAuth(@NotNull Long accountId, @NotEmpty Set<UserAuthorizationEnum> authorizations) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 网关回调后通知已开启的存管用户授权
	 *
	 * @param accountNo
	 *            账号
	 * @param requestNo
	 *            请求流水号
	 * @param authorizations
	 *            已开启授权列表
	 */
	default void notifyEnabledUserAuthorization(@NotNull String accountNo, @NotNull String requestNo, @NotEmpty Set<UserAuthorizationEnum> authorizations) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 关闭存管用户授权
	 *
	 * @param accountNo
	 *            账号
	 * @param authorizations
	 *            关闭授权列表
	 */
	default void disableUserAuthorization(@NotNull String accountNo, @NotEmpty Set<UserAuthorizationEnum> authorizations) {
		throw new UnsupportedOperationException("unimplemented");
	}

	/**
	 * 查询指定用户的投资余额
	 * 
	 * @param userIds
	 * @return
	 */
	default BigDecimal getTotalInvestAmount(@NotEmpty List<String> userIds) {
		throw new UnsupportedOperationException("unimplemented");
	}


	// /**
	// * 查询用户存管账户信息，不校验账户
	// *
	// * @param userId 用户id
	// * @param role 存管账户角色
	// * @return 存管账户基本信息，无账号则返回null
	// */
	// AccountBaseResponse queryAccountInfo(@NotNull String userId, @NotNull
	// UserRoleEnum role);
	//
	// /**
	// * 查询用户存管账户信息，不校验账户
	// * @param userIdSet
	// * @param role
	// * @return
	// */
	// default List<AccountBaseResponse> queryAccountByUserIdSet(@NotNull
	// Set<String> userIdSet, @NotNull UserRoleEnum role){
	// throw new UnsupportedOperationException("unimplemented");
	// }
	//
	//
	// /**
	// * 查询用户开了几个角色的账户
	// *
	// * @param userId
	// * @return
	// */
	// List<AccountBaseResponse> queryAccountByUserId(@NotNull String userId);
	//

	//
	// UserAccountInfoDTO queryUserAccountInfoIndex(String userId);
	//
	//
	// /**
	// * 网关回调后通知已开启的存管用户授权
	// *
	// * @param accountNo 账号
	// * @param requestNo 请求流水号
	// * @param authorizations 已开启授权列表
	// */
	// void notifyEnabledUserAuthorization(@NotNull String accountNo, @NotNull
	// String requestNo, @NotEmpty Set<UserAuthorizationEnum> authorizations);
	//
	// /**
	// * 关闭存管用户授权
	// *
	// * @param userId 用户id
	// * @param role 存管用户角色
	// * @param authorizations 关闭授权列表
	// */
	// void disableUserAuthorization(@NotNull String userId, @NotNull UserRoleEnum
	// role, @NotEmpty Set<UserAuthorizationEnum> authorizations);
	//
	//
	// /**
	// * 查询用户的待收本息
	// * @param userId
	// * @return
	// */
	// BigDecimal queryDueInPrincipalAndInterest(String userId);
	//
	// /**
	// * 修改存管账户的企业信息
	// * @param reqDto
	// * @param reqDto
	// * @return
	// */
	// default boolean updateAccountOrgInfo(CompanyAccountRequestDTO reqDto){return
	// false;}

}
